package com.qfedu.aunt.commons.manager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author xiaobobo
 * @title: RedisManager
 * @projectName aunt_commons_2209
 * @description: TODO
 * @date 2022/11/4  10:26
 */
@Component
public class RedisManager {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 向Redis中写入数据(写缓存一定要设置过期时间 是为了保证数据的最终一致)
     * @param key
     * @param val
     * @param expireTime
     * @param timeUnit
     */
    public void addString(String key, Object val, long expireTime, TimeUnit timeUnit){
        redisTemplate.opsForValue().set(key,val,expireTime,timeUnit);
    }


    /**
     * 从String类型中获取数据
     * @param key
     * @return
     */
    public Object getString(String key){
       return redisTemplate.opsForValue().get(key);
    }

    /**
     * 统计一个分数段内消息的个数
     * @param name
     * @param miniteAgo
     * @param currentTimeMillis
     * @return
     */
    public long count(String name, long miniteAgo, long currentTimeMillis) {
        return redisTemplate.opsForZSet().count(name,miniteAgo,currentTimeMillis);
    }


    /**
     * 向Redis中添加我们的ZSet的数据
     * @param name
     * @param score
     * @param val
     */
    public void addZSet(String name,long score,String val){
       redisTemplate.opsForZSet().add(name,val,score);
    }

    /**
     * 向ZSet中获取数据
     * @param name
     */
    public void getZSet(String name) {



    }

    /**
     *
     * @param name
     * @param val
     */
    public void addSet(String name, String val) {
        //接下来向Redis中写入这个键值对
        redisTemplate.opsForSet().add(name,val);
    }

    /**
     * 从Set集合中获取我们的数据
     * @param name
     */
    public Set getSet(String name) {
       return redisTemplate.opsForSet().members(name);
    }


    /**
     * 通过得分的开始区间和结束区间来进行获取值
     * @param name
     * @param startScore
     * @param endScore
     * @return
     */
    public Set rangByScore(String name,double startScore,double endScore){
        return redisTemplate.opsForZSet().rangeByScore(name,startScore,endScore);
    }


    /**
     * 删除一天之前的数据
     * @param name
     * @param key
     */
    public void deleteZSet(String name, List<String> key) {
        redisTemplate.opsForZSet().remove(name,key);

    }
}
